import axios from 'axios'
import store from '@/store'
import jsonBig from 'json-bigint'

// 用axios 创建对象的方式来配置参数 ，可以设置多个基地址
const request = axios.create({
  // baseURL: 'http://ttapi.research.itcast.cn/',
  baseURL: 'http://toutiao-app.itheima.net/', // 基础路径

  // 自定义处理返回的数据类型
  // jsonBig.parse():处理超出js规定范围的数字，转换为字符串
  transformResponse: [
    function (data) {
      try {
        // 如果转换成功则返回转换的数据结果
        return jsonBig.parse(data)
      } catch (err) {
        // 如果转换失败，则包装为统一数据格式并返回
        return {
          data
        }
      }
    }
  ]
})

// 给请求添加拦截器： 每次的请求都是新的连接，如果是之前已经发过的请求，则请求方式请求头都一样
request.interceptors.request.use(
  config => {
    const { user } = store.state
    // console.log(user)
    // 判断是否有token,如果没有，则需要添加
    // 同样的请求内容可能被多次发起，如果添加了请求头就不需要再次添加了
    if (user && user.token && !config.headers.Authorization) {
      // console.log(111)
      config.headers.Authorization = `Bearer ${user.token}`
    }
    return config
  },
  err => {
    return Promise.reject(err)
  }
)

// 响应拦截器，刷新token
request.interceptors.response.use(
  config => {
    return config
  },
  err => {
    console.dir(err)
    // token过期，需要重新加载
    if (err.response && err.response.status === 401) {
      console.log('用户token过期')
      getNewToken()
    }

    // 把异常抛出去
    return Promise.reject(err)
  }
)

// 获取新的token
async function getNewToken () {
  const { user } = store.state
  if (user && user.refresh_token) {
    const { data: res } = await request({
      url: 'v1_0/authorizations',
      method: 'PUT',
      headers: {
        Authorization: `Bearer ${user.refresh_token}`
      }
    })
    // console.dir(res)
    if (res.message === 'OK') {
      store.commit('setNewToken', res.data.token)
      // 手动刷新页面
      window.location.reload()
    }
  }
}

export default request
